package 纯数组;

import com.alibaba.fastjson.JSON;

public class No73矩阵置零 {

    /**
     * 给定一个 m x n 的矩阵，如果一个元素为 0，则将其所在行和列的所有元素都设为 0。请使用原地算法。
     *
     * 示例 1:
     * 输入:
     * [
     *   [1,1,1],
     *   [1,0,1],
     *   [1,1,1]
     * ]
     * 输出:
     * [
     *   [1,0,1],
     *   [0,0,0],
     *   [1,0,1]
     * ]
     * 示例 2:
     *
     * 输入:
     * [
     *   [0,1,2,0],
     *   [3,4,5,2],
     *   [1,3,1,5]
     * ]
     * 输出:
     * [
     *   [0,0,0,0],
     *   [0,4,5,0],
     *   [0,3,1,0]
     * ]
     * 进阶:
     * 一个直接的解决方案是使用  O(mn) 的额外空间，但这并不是一个好的解决方案。
     * 一个简单的改进方案是使用 O(m + n) 的额外空间，但这仍然不是最好的解决方案。
     * 你能想出一个常数空间的解决方案吗？
     */

    public void setZeroes(int[][] matrix) {

        boolean isHeng=false;
        boolean isShu=false;
        for (int i = 0; i < matrix[0].length; i++) {
            if(matrix[0][i]==0){
                isHeng=true;
                break;
            }
        }
        for (int i = 0; i < matrix.length; i++) {
            if(matrix[i][0]==0){
                isShu=true;
                break;
            }
        }

        //无需管第一列和第一排
        for (int i = 1; i < matrix.length; i++) {
            for (int j = 1; j < matrix[0].length; j++) {
                if(matrix[i][j]==0){
                    matrix[i][0]=0;
                    matrix[0][j]=0;
                }
            }
        }

        //查验第一列
        for (int i = 1; i < matrix.length; i++) {
            if(matrix[i][0]==0){
                //置横排
                for (int j = 0; j < matrix[0].length; j++) {
                    matrix[i][j]=0;
                }
            }
        }

        //查验排
        for (int i = 1; i < matrix[0].length; i++) {
            if(matrix[0][i]==0){
                for (int j = 0; j < matrix.length; j++) {
                    matrix[j][i]=0;
                }
            }
        }
        if(isHeng){
            for (int i = 0; i < matrix[0].length; i++) {
                matrix[0][i]=0;
            }
        }
        if(isShu){
            for (int i = 0; i < matrix.length; i++) {
                matrix[i][0]=0;
            }
        }

    }

    public static void main(String[] args) {
        No73矩阵置零 n=new No73矩阵置零();
        int[][] arr={{0,0,2,0},
                     {3,4,5,1},
                     {1,0,1,2}};
        n.setZeroes(arr);
        System.out.println(JSON.toJSONString(arr));
    }

}
